pronoun_use_post <- pronoun_use_by_donald_posts %>%
mutate(id = str_sub(link_id,start = -6)) %>%
left_join(filter(posts_in_donald, num_comments > 9),by = c("id" = "id")) %>%
transmute(
num_comments=num_comments.x,
collective=collective,
individual=individual,
contains_we = contains_we,
title=title,
selftext=selftext,
domain=domain,
selfpost=ifelse(is.na(selftext),"Not Self Post", "Self Post"),
score=score,
created_utc = created_utc,
date = as.POSIXct(created_utc,tz="", origin="1970-01-01")
) %>% filter(#!is.na(collective),
num_comments > 500)
colSums(is.na(pronoun_use_post))
num_comments collective individual contains_we title selftext domain
0 0 0 0 0 3616 0
selfpost score created_utc date
0 0 0 0
Most and least collective posts
pronoun_use_post %>%
filter(num_comments > 500) %>%
arrange((collective)) #%>% head(100)
pronoun_use_post %>%
filter(num_comments > 100) %>%
ggplot()+
geom_density(aes(collective))

POT8
Particular words in the title of the post
pronoun_use_post %>%
filter(num_comments > 100) %>%
mutate(contains_word =
ifelse(
grepl("TD", (title)) |
grepl("t_d", tolower(title)) |
grepl("the_donald", tolower(title))
#grepl("censor", tolower(title)) |
#grepl("environment", tolower(title)) |
#grepl("ice", tolower(title)) |
#grepl("", tolower(title))
,"climate related", "unrelated"
)) %>%
mutate(self_post = ifelse(is.na(selftext),"no","yes")) %>%
group_by(contains_word) %>%
summarise(
collective_weighted = sum(num_comments*collective)/sum(num_comments),
collective = mean(collective),
num_posts = n(),
total_comments = sum(num_comments)
)
#ggplot()+
#geom_boxplot(aes(contains_word,collective))
Time series analysis
library(plotly)
ggplotly(
ggplot(filter(pronoun_use_post,num_comments >150) ,aes(date,collective,size = num_comments, name = title, color = selfpost))+
geom_point()
)
ALL POLITICAL SUBREDDITS
pronoun_use_post <- pronoun_use_by_political_posts %>%
mutate(id = str_sub(link_id,start = -6)) %>%
left_join(filter(posts_in_political_subs, num_comments > 9),by = c("id" = "id", "subreddit" = "subreddit") )%>%
transmute(subreddit = subreddit,
num_comments=num_comments.x,
collective=collective,
individual=individual,
col_min_ind = contains_we - individual,
contains_we = contains_we,
title=title,
full_title = paste(subreddit,title, sep=": "),
selftext=selftext,
domain=domain,
selfpost=ifelse(is.na(selftext),"Not Self Post", "Self Post"),
score=score,
created_utc = created_utc,
date = as.POSIXct(created_utc,tz="", origin="1970-01-01"),
climate_change = ifelse(
grepl("climate", tolower(title)) |
grepl("temperature", tolower(title)) |
#grepl("pollution", tolower(title)) |
grepl("warming", tolower(title)) |
grepl("environment", tolower(title)) |
#grepl("ice", tolower(title)) |
grepl("environment", tolower(title))
,"climate related", "unrelated"
),
threat = ifelse(
grepl("threat", tolower(title)) |
grepl("extinct", tolower(title)) |
grepl("warns", tolower(title))
,"threat related", "unrelated"
),
aliens = ifelse(
grepl("alien", tolower(title))
,"alien related", "unrelated"
),
any_of_three = ifelse(
climate_change == "climate related"|
threat == "threat related" |
aliens == "alien related"
,"any of 3 related", "unrelated"
)
) %>% filter(#!is.na(collective),
num_comments > 50) %>%
left_join(read_csv("subreddit_categories.csv"), by = c("subreddit" = "subreddit"))
Parsed with column specification:
cols(
subreddit = col_character(),
topic_level1 = col_character(),
topic_level2 = col_character(),
topic_level3 = col_character(),
t1_t2 = col_character()
)
worldnews
ALL POLITICAL SUBREDDITS
pronoun_use_post <- pronoun_use_by_worldnews2016_posts %>%
mutate(id = str_sub(link_id,start = -6)) %>%
left_join(filter(posts_in_political_subs, subreddit == "worldnews"),by = c("id" = "id" ))%>%
transmute(subreddit = subreddit,
num_comments=num_comments.x,
collective = collective,
score = score.x,
title=title,
selftext=selftext,
domain=domain,
selfpost=ifelse(is.na(selftext),"Not Self Post", "Self Post"),
created_utc = created_utc,
date = as.POSIXct(created_utc,tz="", origin="1970-01-01")) %>%
filter(#!is.na(collective),
num_comments > 50) %>%
left_join(read_csv("subreddit_categories.csv"), by = c("subreddit" = "subreddit"))
Parsed with column specification:
cols(
subreddit = col_character(),
topic_level1 = col_character(),
topic_level2 = col_character(),
topic_level3 = col_character(),
t1_t2 = col_character()
)
colSums(is.na(pronoun_use_post))
subreddit num_comments collective score title selftext domain
1 0 0 0 1 4658 1
selfpost created_utc date topic_level1 topic_level2 topic_level3 t1_t2
0 1 1 1 1 4841 1
reg worldnews
worldnews_posts <- read_delim("worldnews_environmental_posts - worldnews_posts.tsv",
"\t", escape_double = FALSE, trim_ws = TRUE) %>%
mutate(threat_score = case_when(
threat_score == "e" ~ "Environmental Related",
threat_score == "a" ~ "Alien/Space travel Related",
TRUE ~ "Other"
)) %>% filter(!is.na(title))
Parsed with column specification:
cols(
.default = col_character(),
num_comments = col_integer(),
collective = col_double(),
individual = col_double(),
col_min_ind = col_double(),
contains_we = col_double(),
score = col_integer(),
created_utc = col_integer(),
date = col_datetime(format = "")
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)8 parsing failures.
row [38;5;246m# A tibble: 5 x 5[39m col row col expected actual file expected [3m[38;5;246m<int>[39m[23m [3m[38;5;246m<chr>[39m[23m [3m[38;5;246m<chr>[39m[23m [3m[38;5;246m<chr>[39m[23m [3m[38;5;246m<chr>[39m[23m actual [38;5;250m1[39m [4m1[24m119 score an integer unrelated 'worldnews_environmental_posts - worldnews_posts.tsv' file [38;5;250m2[39m [4m1[24m119 created_utc an integer unrelated 'worldnews_environmental_posts - worldnews_posts.tsv' row [38;5;250m3[39m [4m1[24m119 date [38;5;246m"[39mdate like [38;5;246m"[39m unrelated 'worldnews_environmental_posts - worldnews_posts.tsv' col [38;5;250m4[39m [4m1[24m119 [31mNA[39m 24 columns 21 columns 'worldnews_environmental_posts - worldnews_posts.tsv' expected [38;5;250m5[39m [4m2[24m404 score an integer unrelated 'worldnews_environmental_posts - worldnews_posts.tsv'
... ................................. ... ................................................................................................. ........ .............................................................................................................................................................................................................................. ...... .......................................................................................................................... .... .......................................................................................................................... ... .......................................................................................................................................................... ... .................................................................................................................................... ........ ..........................................................................................................................
See problems(...) for more details.
POT 7
library(plotly)
#ggplotly(
ggplot(worldnews_posts ,aes(date,collective,size = num_comments, name = full_title, color = threat_score))+
geom_point()+
theme_classic()+
scale_y_continuous()

#)
worldnews_posts %>% group_by(threat_score) %>% summarise(
number_of_posts = n(),
avg_collective = mean(collective),
avg_individual = mean(individual)
)
ggplot(mutate(worldnews_posts,col_pct = 100*collective) ,aes(threat_score,col_pct,size = num_comments))+ geom_boxplot() + geom_jitter(alpha = 0.1) + theme_classic(base_size = 16)+
labs(title = "Collective Pronoun Use by Topic in posts from /r/worldnews",
subtitle = "All posts from 2016 with at least 500 comments, each circle represents a post scaled by number of comments",
caption = "") + xlab("")+ ylab("Percentage of Comments which contains Collective Pronouns")

ggplot(worldnews_posts ,aes(threat_score,individual,size = num_comments))+ geom_boxplot()

#worldnews_posts %>% filter(threat_score == "Environmental Related") %>% arrange(desc(collective)) %>% select(collective,title, num_comments, individual,contains_we,date) %>% write_csv("worldnews_environment2.csv")

Hyp test
t.test(oss$collective,glob$collective, alternative = "greater", mu = 0,
paired = FALSE, var.equal = FALSE, conf.level = 0.95)
Welch Two Sample t-test
data: oss$collective and glob$collective
t = 1.9619, df = 7.8336, p-value = 0.04309
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
0.002858331 Inf
sample estimates:
mean of x mean of y
0.3409869 0.2833103
Score analysis by threat scale
POT99
worldnews_graphs <- worldnews_environment_threat_level %>%
#filter(problem == "problem") %>%
select(title, threat_level, problem) %>%
left_join(worldnews_posts,., by = c("title" = "title")) %>%
select(-(score)) %>%
mutate(threat_level = case_when(
problem == "Resolution" ~ "All Environmental Resolutions",
!is.na(threat_level) ~ as.character(threat_level),
star_system == "o" ~ "Outside Solar System",
star_system == "i" ~ "Inside Solar System",
TRUE~"All Other"
),
threat_level = factor(threat_level,threat_levels2)) %>% left_join(pronoun_use_post,., by = c("title" = "title")) %>% filter(!is.na(threat_level))
worldnews_graphs2 <- worldnews_graphs %>% group_by(title) %>% summarise(score_avg = mean(score)) %>% ungroup() %>%
left_join(worldnews_graphs,., by = c("title" = "title")) %>% mutate(score_ratio =
score/(score -2*(score-score_avg))
) %>%
filter(collective.x == "Contains collective")
ggplot(worldnews_graphs2,
aes(threat_level,score_ratio, size = num_comments.x))+ geom_boxplot(outlier.alpha = 0) +
geom_jitter(width=.25,alpha = 0.2) +
theme_classic() + labs(title = "Score Ratio between comments with Collective Pronouns and Without in Posts from /r/worldnews by Scale of Threat/Resolution",
subtitle = "all posts from 2016 with at least 500 comments, each circle represents a post scaled by number of comments",
caption = "") + geom_hline(yintercept = 1) + theme_classic(base_size = 12) +xlab("") + ylab("Score ratio between comments with and without collective pronouns for each post") +scale_y_continuous(limits = c(0,4)) + theme(axis.text=element_text(size=8))
## hypothesis testing
worldnews_graphs2 %>%
group_by(problem,threat_level) %>%
summarise(
total_comments = sum(num_comments.x),
collective_avg = sum(collective*num_comments)/total_comments,
individual_avg = sum(individual*num_comments)/total_comments,
col_min =collective_avg + sqrt(collective_avg*(1-collective_avg)/total_comments),
col_max =collective_avg - sqrt(collective_avg*(1-collective_avg)/total_comments)
)
#only environmental
worldnews_graphs %>% group_by(title) %>% summarise(score_avg = mean(score)) %>% ungroup() %>%
left_join(worldnews_graphs,., by = c("title" = "title")) %>% mutate(score_ratio = score/score_avg) %>%
filter(climate_change == "related") %>%
ggplot(
aes(threat_level,score_ratio, size = num_comments.x))+ geom_boxplot(outlier.alpha = 0) +
geom_jitter(width=.25,alpha = 0.2) + facet_grid(~collective.x) +
theme_classic() + labs(title = "Score Ratio between comments with Collective Pronouns and Without in Posts from /r/worldnews by Scale of Threat/Resolution",
subtitle = "all posts from 2016 with at least 500 comments, each circle represents a post scaled by number of comments",
caption = "") + geom_hline(yintercept = 1) + theme_classic() +xlab("") + ylab("Average score ratio between comments with and without collective pronouns")
LS0tCnRpdGxlOiAiMDZfcG9zdF90b3BpY19hbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9Cgpwcm9ub3VuX3VzZV9wb3N0IDwtIHByb25vdW5fdXNlX2J5X2RvbmFsZF9wb3N0cyAlPiUKICBtdXRhdGUoaWQgPSBzdHJfc3ViKGxpbmtfaWQsc3RhcnQgPSAtNikpICU+JQogIGxlZnRfam9pbihmaWx0ZXIocG9zdHNfaW5fZG9uYWxkLCBudW1fY29tbWVudHMgPiA5KSxieSA9IGMoImlkIiA9ICJpZCIpKSAlPiUKICB0cmFuc211dGUoCiAgICAgICAgICAgIG51bV9jb21tZW50cz1udW1fY29tbWVudHMueCwKICAgICAgICAgICAgY29sbGVjdGl2ZT1jb2xsZWN0aXZlLAogICAgICAgICAgICBpbmRpdmlkdWFsPWluZGl2aWR1YWwsCiAgICAgICAgICAgIGNvbnRhaW5zX3dlID0gY29udGFpbnNfd2UsCiAgICAgICAgICAgIHRpdGxlPXRpdGxlLAogICAgICAgICAgICBzZWxmdGV4dD1zZWxmdGV4dCwKICAgICAgICAgICAgZG9tYWluPWRvbWFpbiwKICAgICAgICAgICAgc2VsZnBvc3Q9aWZlbHNlKGlzLm5hKHNlbGZ0ZXh0KSwiTm90IFNlbGYgUG9zdCIsICJTZWxmIFBvc3QiKSwKICAgICAgICAgICAgc2NvcmU9c2NvcmUsCiAgICAgICAgICAgIGNyZWF0ZWRfdXRjID0gY3JlYXRlZF91dGMsCiAgICAgICAgICAgIGRhdGUgPSBhcy5QT1NJWGN0KGNyZWF0ZWRfdXRjLHR6PSIiLCBvcmlnaW49IjE5NzAtMDEtMDEiKQogICAgICAgICAgICApICU+JSBmaWx0ZXIoIyFpcy5uYShjb2xsZWN0aXZlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb21tZW50cyA+IDUwMCkKCmNvbFN1bXMoaXMubmEocHJvbm91bl91c2VfcG9zdCkpCgpgYGAKCgpNb3N0IGFuZCBsZWFzdCBjb2xsZWN0aXZlIHBvc3RzCmBgYHtyfQpwcm9ub3VuX3VzZV9wb3N0ICU+JQogIGZpbHRlcihudW1fY29tbWVudHMgPiA1MDApICU+JQogIGFycmFuZ2UoKGNvbGxlY3RpdmUpKSAjJT4lIGhlYWQoMTAwKQpgYGAKCmBgYHtyfQpwcm9ub3VuX3VzZV9wb3N0ICU+JQogIGZpbHRlcihudW1fY29tbWVudHMgPiAxMDApICU+JQogIGdncGxvdCgpKwogIGdlb21fZGVuc2l0eShhZXMoY29sbGVjdGl2ZSkpCmBgYAoKIyNQT1Q4CiMjUGFydGljdWxhciB3b3JkcyBpbiB0aGUgdGl0bGUgb2YgdGhlIHBvc3QKYGBge3J9CnByb25vdW5fdXNlX3Bvc3QgJT4lCiAgZmlsdGVyKG51bV9jb21tZW50cyA+IDEwMCkgJT4lCiAgbXV0YXRlKGNvbnRhaW5zX3dvcmQgPSAKICAgICAgICBpZmVsc2UoCiAgICAgIGdyZXBsKCJURCIsICh0aXRsZSkpIHwgCiAgICAgIGdyZXBsKCJ0X2QiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoInRoZV9kb25hbGQiLCB0b2xvd2VyKHRpdGxlKSkgCiAgICAgICNncmVwbCgiY2Vuc29yIiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgI2dyZXBsKCJlbnZpcm9ubWVudCIsIHRvbG93ZXIodGl0bGUpKSB8CiAgICAgICNncmVwbCgiaWNlIiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgI2dyZXBsKCIiLCB0b2xvd2VyKHRpdGxlKSkgCiAgICAgICwiY2xpbWF0ZSByZWxhdGVkIiwgInVucmVsYXRlZCIKICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUKbXV0YXRlKHNlbGZfcG9zdCA9IGlmZWxzZShpcy5uYShzZWxmdGV4dCksIm5vIiwieWVzIikpICU+JQogIGdyb3VwX2J5KGNvbnRhaW5zX3dvcmQpICU+JQogIHN1bW1hcmlzZSgKICAgIGNvbGxlY3RpdmVfd2VpZ2h0ZWQgPSBzdW0obnVtX2NvbW1lbnRzKmNvbGxlY3RpdmUpL3N1bShudW1fY29tbWVudHMpLAogICAgY29sbGVjdGl2ZSA9ICBtZWFuKGNvbGxlY3RpdmUpLAogICAgbnVtX3Bvc3RzICA9IG4oKSwKICAgIHRvdGFsX2NvbW1lbnRzID0gc3VtKG51bV9jb21tZW50cykKICApCiAgI2dncGxvdCgpKwogICNnZW9tX2JveHBsb3QoYWVzKGNvbnRhaW5zX3dvcmQsY29sbGVjdGl2ZSkpCgoKCmBgYAoKIyMgVGltZSBzZXJpZXMgYW5hbHlzaXMKCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKCmdncGxvdGx5KAogIGdncGxvdChmaWx0ZXIocHJvbm91bl91c2VfcG9zdCxudW1fY29tbWVudHMgPjE1MCkgLGFlcyhkYXRlLGNvbGxlY3RpdmUsc2l6ZSA9IG51bV9jb21tZW50cywgbmFtZSA9IHRpdGxlLCBjb2xvciA9IHNlbGZwb3N0KSkrCiAgZ2VvbV9wb2ludCgpCikKYGBgCgoKIyMgQUxMIFBPTElUSUNBTCBTVUJSRURESVRTCgpgYGB7cn0KcHJvbm91bl91c2VfcG9zdCA8LSBwcm9ub3VuX3VzZV9ieV9wb2xpdGljYWxfcG9zdHMgJT4lCiAgbXV0YXRlKGlkID0gc3RyX3N1YihsaW5rX2lkLHN0YXJ0ID0gLTYpKSAlPiUKICBsZWZ0X2pvaW4oZmlsdGVyKHBvc3RzX2luX3BvbGl0aWNhbF9zdWJzLCBudW1fY29tbWVudHMgPiA5KSxieSA9IGMoImlkIiA9ICJpZCIsICJzdWJyZWRkaXQiID0gInN1YnJlZGRpdCIpICklPiUKICB0cmFuc211dGUoc3VicmVkZGl0ID0gc3VicmVkZGl0LAogICAgICAgICAgICBudW1fY29tbWVudHM9bnVtX2NvbW1lbnRzLngsCiAgICAgICAgICAgIGNvbGxlY3RpdmU9Y29sbGVjdGl2ZSwKICAgICAgICAgICAgaW5kaXZpZHVhbD1pbmRpdmlkdWFsLAogICAgICAgICAgICBjb2xfbWluX2luZCA9IGNvbnRhaW5zX3dlIC0gaW5kaXZpZHVhbCwKICAgICAgICAgICAgY29udGFpbnNfd2UgPSBjb250YWluc193ZSwKICAgICAgICAgICAgdGl0bGU9dGl0bGUsCiAgICAgICAgICAgIGZ1bGxfdGl0bGUgPSBwYXN0ZShzdWJyZWRkaXQsdGl0bGUsIHNlcD0iOiAiKSwKICAgICAgICAgICAgc2VsZnRleHQ9c2VsZnRleHQsCiAgICAgICAgICAgIGRvbWFpbj1kb21haW4sCiAgICAgICAgICAgIHNlbGZwb3N0PWlmZWxzZShpcy5uYShzZWxmdGV4dCksIk5vdCBTZWxmIFBvc3QiLCAiU2VsZiBQb3N0IiksCiAgICAgICAgICAgIHNjb3JlPXNjb3JlLAogICAgICAgICAgICBjcmVhdGVkX3V0YyA9IGNyZWF0ZWRfdXRjLAogICAgICAgICAgICBkYXRlID0gYXMuUE9TSVhjdChjcmVhdGVkX3V0Yyx0ej0iIiwgb3JpZ2luPSIxOTcwLTAxLTAxIiksCiAgICAgICAgICAgIGNsaW1hdGVfY2hhbmdlID0gaWZlbHNlKAogICAgZ3JlcGwoImNsaW1hdGUiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoInRlbXBlcmF0dXJlIiwgdG9sb3dlcih0aXRsZSkpIHwgCiAgICAgICNncmVwbCgicG9sbHV0aW9uIiwgdG9sb3dlcih0aXRsZSkpIHwgCiAgICAgIGdyZXBsKCJ3YXJtaW5nIiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgZ3JlcGwoImVudmlyb25tZW50IiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgI2dyZXBsKCJpY2UiLCB0b2xvd2VyKHRpdGxlKSkgfAogICAgICBncmVwbCgiZW52aXJvbm1lbnQiLCB0b2xvd2VyKHRpdGxlKSkgCiAgICAgICwiY2xpbWF0ZSByZWxhdGVkIiwgInVucmVsYXRlZCIKICApLAogIHRocmVhdCA9IGlmZWxzZSgKICAgIGdyZXBsKCJ0aHJlYXQiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoImV4dGluY3QiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoIndhcm5zIiwgdG9sb3dlcih0aXRsZSkpIAogICAgICAsInRocmVhdCByZWxhdGVkIiwgInVucmVsYXRlZCIKICApLAogIGFsaWVucyA9IGlmZWxzZSgKICAgIGdyZXBsKCJhbGllbiIsIHRvbG93ZXIodGl0bGUpKQogICAgICAKICAgICAgLCJhbGllbiByZWxhdGVkIiwgInVucmVsYXRlZCIKICApLAogIGFueV9vZl90aHJlZSA9IGlmZWxzZSgKICAgICBjbGltYXRlX2NoYW5nZSA9PSAiY2xpbWF0ZSByZWxhdGVkInwgCiAgICAgIHRocmVhdCA9PSAidGhyZWF0IHJlbGF0ZWQiIHwKICAgICAgYWxpZW5zID09ICJhbGllbiByZWxhdGVkIgogICAgICAsImFueSBvZiAzIHJlbGF0ZWQiLCAidW5yZWxhdGVkIgogICkKICAgICAgICAgICAgKSAlPiUgZmlsdGVyKCMhaXMubmEoY29sbGVjdGl2ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29tbWVudHMgPiA1MCkgJT4lCiAgbGVmdF9qb2luKHJlYWRfY3N2KCJzdWJyZWRkaXRfY2F0ZWdvcmllcy5jc3YiKSwgYnkgPSBjKCJzdWJyZWRkaXQiID0gInN1YnJlZGRpdCIpKQoKY29sU3Vtcyhpcy5uYShwcm9ub3VuX3VzZV9wb3N0KSkKCmBgYAoKYGBge3J9CmxpYnJhcnkocGxvdGx5KQpnZ3Bsb3RseSgKICBnZ3Bsb3QoZmlsdGVyKHByb25vdW5fdXNlX3Bvc3QsbnVtX2NvbW1lbnRzID41MDAsIHN1YnJlZGRpdCA9PSAiVGhlX0RvbmFsZCIpICxhZXMoZGF0ZSxjb2xsZWN0aXZlLHNpemUgPSBudW1fY29tbWVudHMsIG5hbWUgPSBmdWxsX3RpdGxlLCBjb2xvciA9IGNsaW1hdGVfY2hhbmdlKSkrCiAgZ2VvbV9wb2ludCgpCikKYGBgCmBgYHtyfQpmaWx0ZXIocHJvbm91bl91c2VfcG9zdCxudW1fY29tbWVudHMgPjUwMCwgc3VicmVkZGl0ID09ICJ3b3JsZG5ld3MiKSAlPiUgCiAgbXV0YXRlKGNsaW1hdGVfY2hhbmdlID0gaWZlbHNlKAogICAgZ3JlcGwoImNsaW1hdGUiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoInRlbXBlcmF0dXJlIiwgdG9sb3dlcih0aXRsZSkpIHwgCiAgICAgICNncmVwbCgicG9sbHV0aW9uIiwgdG9sb3dlcih0aXRsZSkpIHwgCiAgICAgIGdyZXBsKCJ3YXJtaW5nIiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgZ3JlcGwoImVudmlyb25tZW50IiwgdG9sb3dlcih0aXRsZSkpIAogICAgICAsImNsaW1hdGUgcmVsYXRlZCIsICJ1bnJlbGF0ZWQiCiAgKQogICAgKSAlPiUKICBhcnJhbmdlKGRlc2MoY29sX21pbl9pbmQpKSAlPiUgaGVhZCg1MCkKYGBgCiMjIHdvcmxkbmV3cwoKIyMgQUxMIFBPTElUSUNBTCBTVUJSRURESVRTCgpgYGB7cn0KcHJvbm91bl91c2VfcG9zdCA8LSBwcm9ub3VuX3VzZV9ieV93b3JsZG5ld3MyMDE2X3Bvc3RzICU+JQogIG11dGF0ZShpZCA9IHN0cl9zdWIobGlua19pZCxzdGFydCA9IC02KSkgJT4lCiAgbGVmdF9qb2luKGZpbHRlcihwb3N0c19pbl9wb2xpdGljYWxfc3Vicywgc3VicmVkZGl0ID09ICJ3b3JsZG5ld3MiKSxieSA9IGMoImlkIiA9ICJpZCIgKSklPiUKICB0cmFuc211dGUoc3VicmVkZGl0ID0gc3VicmVkZGl0LAogICAgICAgICAgICBudW1fY29tbWVudHM9bnVtX2NvbW1lbnRzLngsCiAgICAgICAgICAgIGNvbGxlY3RpdmUgPSBjb2xsZWN0aXZlLAogICAgICAgICAgICBzY29yZSA9IHNjb3JlLngsCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAKICAgICAgICAgICAgdGl0bGU9dGl0bGUsCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmdGV4dD1zZWxmdGV4dCwKICAgICAgICAgICAgZG9tYWluPWRvbWFpbiwKICAgICAgICAgICAgc2VsZnBvc3Q9aWZlbHNlKGlzLm5hKHNlbGZ0ZXh0KSwiTm90IFNlbGYgUG9zdCIsICJTZWxmIFBvc3QiKSwKICAgICAgICAgICAgCiAgICAgICAgICAgIGNyZWF0ZWRfdXRjID0gY3JlYXRlZF91dGMsCiAgICAgICAgICAgIGRhdGUgPSBhcy5QT1NJWGN0KGNyZWF0ZWRfdXRjLHR6PSIiLCBvcmlnaW49IjE5NzAtMDEtMDEiKSkgJT4lIAogICAgICAgICAgICBmaWx0ZXIoIyFpcy5uYShjb2xsZWN0aXZlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb21tZW50cyA+IDUwKSAlPiUKICBsZWZ0X2pvaW4ocmVhZF9jc3YoInN1YnJlZGRpdF9jYXRlZ29yaWVzLmNzdiIpLCBieSA9IGMoInN1YnJlZGRpdCIgPSAic3VicmVkZGl0IikpCgpjb2xTdW1zKGlzLm5hKHByb25vdW5fdXNlX3Bvc3QpKQoKYGBgCgoKCgojIyByZWcgd29ybGRuZXdzCmBgYHtyfQp3b3JsZG5ld3NfcG9zdHMgPC0gcmVhZF9kZWxpbSgid29ybGRuZXdzX2Vudmlyb25tZW50YWxfcG9zdHMgLSB3b3JsZG5ld3NfcG9zdHMudHN2IiwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUKICBtdXRhdGUodGhyZWF0X3Njb3JlID0gY2FzZV93aGVuKAogICAgdGhyZWF0X3Njb3JlID09ICJlIiB+ICJFbnZpcm9ubWVudGFsIFJlbGF0ZWQiLAogICAgdGhyZWF0X3Njb3JlID09ICJhIiB+ICJBbGllbi9TcGFjZSB0cmF2ZWwgUmVsYXRlZCIsCiAgICBUUlVFIH4gIk90aGVyIgogICAgCiAgKSkgICU+JSBmaWx0ZXIoIWlzLm5hKHRpdGxlKSkKYGBgCiMjUE9UIDcKYGBge3J9CmxpYnJhcnkocGxvdGx5KQojZ2dwbG90bHkoCiAgZ2dwbG90KHdvcmxkbmV3c19wb3N0cyAsYWVzKGRhdGUsY29sbGVjdGl2ZSxzaXplID0gbnVtX2NvbW1lbnRzLCBuYW1lID0gZnVsbF90aXRsZSwgY29sb3IgPSB0aHJlYXRfc2NvcmUpKSsKICBnZW9tX3BvaW50KCkrCiAgICB0aGVtZV9jbGFzc2ljKCkrCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoKQogICAgICAgICAgICAgICAgICAKIykKCgp3b3JsZG5ld3NfcG9zdHMgJT4lIGdyb3VwX2J5KHRocmVhdF9zY29yZSkgJT4lIHN1bW1hcmlzZSgKICBudW1iZXJfb2ZfcG9zdHMgPSBuKCksCiAgYXZnX2NvbGxlY3RpdmUgPSBtZWFuKGNvbGxlY3RpdmUpLAogIGF2Z19pbmRpdmlkdWFsID0gbWVhbihpbmRpdmlkdWFsKQopCmdncGxvdChtdXRhdGUod29ybGRuZXdzX3Bvc3RzLGNvbF9wY3QgPSAxMDAqY29sbGVjdGl2ZSkgLGFlcyh0aHJlYXRfc2NvcmUsY29sX3BjdCxzaXplID0gbnVtX2NvbW1lbnRzKSkrIGdlb21fYm94cGxvdCgpICsgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjEpICsgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNikrCiAgICAgICBsYWJzKHRpdGxlID0gIkNvbGxlY3RpdmUgUHJvbm91biBVc2UgYnkgVG9waWMgaW4gcG9zdHMgZnJvbSAvci93b3JsZG5ld3MiLAogICAgICAgc3VidGl0bGUgPSAiQWxsIHBvc3RzIGZyb20gMjAxNiB3aXRoIGF0IGxlYXN0IDUwMCBjb21tZW50cywgZWFjaCBjaXJjbGUgcmVwcmVzZW50cyBhIHBvc3Qgc2NhbGVkIGJ5IG51bWJlciBvZiBjb21tZW50cyIsCiAgICAgICBjYXB0aW9uID0gIiIpICsgeGxhYigiIikrIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgQ29tbWVudHMgd2hpY2ggY29udGFpbnMgQ29sbGVjdGl2ZSBQcm9ub3VucyIpIAogICAgICAgCmdncGxvdCh3b3JsZG5ld3NfcG9zdHMgLGFlcyh0aHJlYXRfc2NvcmUsaW5kaXZpZHVhbCxzaXplID0gbnVtX2NvbW1lbnRzKSkrIGdlb21fYm94cGxvdCgpIAoKCgojd29ybGRuZXdzX3Bvc3RzICU+JSBmaWx0ZXIodGhyZWF0X3Njb3JlID09ICJFbnZpcm9ubWVudGFsIFJlbGF0ZWQiKSAlPiUgYXJyYW5nZShkZXNjKGNvbGxlY3RpdmUpKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUsdGl0bGUsIG51bV9jb21tZW50cywgaW5kaXZpZHVhbCxjb250YWluc193ZSxkYXRlKSAlPiUgd3JpdGVfY3N2KCJ3b3JsZG5ld3NfZW52aXJvbm1lbnQyLmNzdiIpCmBgYAoKCmBgYHtyfQp0aHJlYXRfbGV2ZWxzIDwtIGMoIlBlcnNvbi9QbGFjZS9CdXNpbmVzcyIsCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIkNvdW50cnkiLAogICAgICAgICAgICAgICAgICAgIlJlaWdvbmFsIiwKICAgICAgICAgICAgICAgICAgICJHbG9iYWwiCgoKKQoKdGhyZWF0X2xldmVsczIgPC0gYygiQWxsIE90aGVyIiwKICAgICAgICAgICAgICAgICAgICAiQWxsIEVudmlyb25tZW50YWwgUmVzb2x1dGlvbnMiLAogICAgICAgICAgICAgICAgICAgICJQZXJzb24vUGxhY2UvQnVzaW5lc3MiLAogICAgICAgICAgICAgICAgICAgIkNvdW50cnkiLAogICAgICAgICAgICAgICAgICAgIlJlaWdvbmFsIiwKICAgICAgICAgICAgICAgICAgICJHbG9iYWwiLAogICAgICAgICAgICAgICAgICAgIkluc2lkZSBTb2xhciBTeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgIk91dHNpZGUgU29sYXIgU3lzdGVtIgoKCikKCndvcmxkbmV3c19lbnZpcm9ubWVudF90aHJlYXRfbGV2ZWwgPC0gcmVhZF9kZWxpbSgid29ybGRuZXdzX2Vudmlyb25tZW50Ml90aHJlYXRfbGV2ZWwudHN2IiwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgbXV0YXRlKHRocmVhdF9sZXZlbCA9IGNhc2Vfd2hlbigKICAgIHRocmVhdF9sZXZlbCA9PSAiZSIgfiAiR2xvYmFsIiwKICAgIHRocmVhdF9sZXZlbCA9PSAiYyIgfiAiQ291bnRyeSIsCiAgICB0aHJlYXRfbGV2ZWwgPT0gImIiIHwKICAgIHRocmVhdF9sZXZlbCA9PSAicyIgfiAiUGVyc29uL1BsYWNlL0J1c2luZXNzIiwKICAgIHRocmVhdF9sZXZlbCA9PSAiciIgfiAiUmVpZ29uYWwiLAogICAgVFJVRSB+ICJPdGhlciIpLAogICAgcHJvYmxlbSA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbSA9PSAibiIgfiAiUmVzb2x1dGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiVGhyZWF0IiksCiAgICAgICAgICAgICAgICAgICAKICAgIHRocmVhdF9sZXZlbCA9IGZhY3Rvcih0aHJlYXRfbGV2ZWwsdGhyZWF0X2xldmVscyksCiAgICBjb2xfcGN0PWNvbGxlY3RpdmUqMTAwKQoKZ2dwbG90KHdvcmxkbmV3c19lbnZpcm9ubWVudF90aHJlYXRfbGV2ZWwsCiAgICAgICBhZXModGhyZWF0X2xldmVsLGNvbF9wY3Qsc2l6ZSA9IG51bV9jb21tZW50cykpKyBnZW9tX2JveHBsb3QoKSArIGdlb21faml0dGVyKHdpZHRoPS4yLGFscGhhID0gMC41KSArIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTYpICsgZmFjZXRfd3JhcCh+cHJvYmxlbSkgKwogIGxhYnModGl0bGUgPSAiQ29sbGVjdGl2ZSBQcm9ub3VuIFVzZSBieSBUaHJlYXQgU3RhdHVzIGFuZCBTY2FsZSBpbiBwb3N0cyBmcm9tIC9yL3dvcmxkbmV3cyIsCiAgICAgICBzdWJ0aXRsZSA9ICJhbGwgcG9zdHMgZnJvbSAyMDE2IHdpdGggYXQgbGVhc3QgNTAwIGNvbW1lbnRzLCBlYWNoIGNpcmNsZSByZXByZXNlbnRzIGEgcG9zdCBzY2FsZWQgYnkgbnVtYmVyIG9mIGNvbW1lbnRzIiwKICAgICAgIGNhcHRpb24gPSAiIikgKyB4bGFiKCJTY2FsZSBvZiBFbnZpcm9ubWVudGFsIFRocmVhdC9SZXNvbHV0aW9uIikgKyB5bGFiKCJQZXJjZW50YWdlIG9mIENvbW1lbnRzIHdoaWNoIGNvbnRhaW5zIENvbGxlY3RpdmUgUHJvbm91bnMiKSAKI2dncGxvdCh3b3JsZG5ld3NfZW52aXJvbm1lbnRfdGhyZWF0X2xldmVsLAojICAgICAgIGFlcyhwcm9ibGVtLGNvbnRhaW5zX3dlLHNpemUgPSBudW1fY29tbWVudHMpKSsgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX2ppdHRlcih3aWR0aD0uMixhbHBoYSA9IDAuNSkgKyAjdGhlbWVfY2xhc3NpYygpICsgZmFjZXRfZ3JpZCh+dGhyZWF0X2xldmVsKQoKd29ybGRuZXdzX2Vudmlyb25tZW50X3RocmVhdF9sZXZlbCAlPiUKICBncm91cF9ieShwcm9ibGVtLHRocmVhdF9sZXZlbCkgJT4lCiAgc3VtbWFyaXNlKAogICAgdG90YWxfY29tbWVudHMgPSBzdW0obnVtX2NvbW1lbnRzKSwKICAgIGNvbGxlY3RpdmVfYXZnID0gc3VtKGNvbGxlY3RpdmUqbnVtX2NvbW1lbnRzKS90b3RhbF9jb21tZW50cywKICAgIGluZGl2aWR1YWxfYXZnID0gc3VtKGluZGl2aWR1YWwqbnVtX2NvbW1lbnRzKS90b3RhbF9jb21tZW50cywKICAgIGNvbF9taW4gPWNvbGxlY3RpdmVfYXZnICsgc3FydChjb2xsZWN0aXZlX2F2ZyooMS1jb2xsZWN0aXZlX2F2ZykvdG90YWxfY29tbWVudHMpLAogICAgY29sX21heCA9Y29sbGVjdGl2ZV9hdmcgLSBzcXJ0KGNvbGxlY3RpdmVfYXZnKigxLWNvbGxlY3RpdmVfYXZnKS90b3RhbF9jb21tZW50cykKICApCgpnZ3Bsb3Qod29ybGRuZXdzX2Vudmlyb25tZW50X3RocmVhdF9sZXZlbCwKICAgICAgIGFlcyhudW1fY29tbWVudHMsY29sbGVjdGl2ZSkpKyBnZW9tX3BvaW50KCkgKyBzY2FsZV94X2xvZzEwKCkKCndvcmxkbmV3c19ncmFwaHMgPC0gd29ybGRuZXdzX2Vudmlyb25tZW50X3RocmVhdF9sZXZlbCAlPiUgCiAgI2ZpbHRlcihwcm9ibGVtID09ICJwcm9ibGVtIikgJT4lIAogIHNlbGVjdCh0aXRsZSwgdGhyZWF0X2xldmVsLCBwcm9ibGVtKSAlPiUKICBsZWZ0X2pvaW4od29ybGRuZXdzX3Bvc3RzLC4sIGJ5ID0gYygidGl0bGUiID0gInRpdGxlIikpICU+JSAKICBtdXRhdGUodGhyZWF0X2xldmVsID0gY2FzZV93aGVuKAogICAgcHJvYmxlbSA9PSAiUmVzb2x1dGlvbiIgfiAiQWxsIEVudmlyb25tZW50YWwgUmVzb2x1dGlvbnMiLAogICAgIWlzLm5hKHRocmVhdF9sZXZlbCkgfiBhcy5jaGFyYWN0ZXIodGhyZWF0X2xldmVsKSwKICAgICBzdGFyX3N5c3RlbSA9PSAibyIgfiAgIk91dHNpZGUgU29sYXIgU3lzdGVtIiwKICAgIHN0YXJfc3lzdGVtID09ICJpIiB+ICAiSW5zaWRlIFNvbGFyIFN5c3RlbSIsCiAgICAgICAgICAgICAgIFRSVUV+IkFsbCBPdGhlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIAogICAgICAgICB0aHJlYXRfbGV2ZWwgPSBmYWN0b3IodGhyZWF0X2xldmVsLHRocmVhdF9sZXZlbHMyKSwKICAgIGNvbF9wY3QgPSBjb2xsZWN0aXZlKjEwMCkgCiAKICBnZ3Bsb3Qod29ybGRuZXdzX2dyYXBocywKICAgICAgIGFlcyh0aHJlYXRfbGV2ZWwsY29sX3BjdCwgc2l6ZSA9IG51bV9jb21tZW50cykpKyBnZW9tX2JveHBsb3Qob3V0bGllci5hbHBoYSA9IDApICsgCiAgZ2VvbV9qaXR0ZXIod2lkdGg9LjI1LGFscGhhID0gMC4yKSArIAogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTYpICsgbGFicyh0aXRsZSA9ICJDb2xsZWN0aXZlIFByb25vdW4gVXNlIGluIFBvc3RzIGZyb20gL3Ivd29ybGRuZXdzIGJ5IFNjYWxlIG9mIFRocmVhdC9SZXNvbHV0aW9uIiwKICAgICAgIHN1YnRpdGxlID0gImFsbCBwb3N0cyBmcm9tIDIwMTYgd2l0aCBhdCBsZWFzdCA1MDAgY29tbWVudHMsIGVhY2ggY2lyY2xlIHJlcHJlc2VudHMgYSBwb3N0IHNjYWxlZCBieSBudW1iZXIgb2YgY29tbWVudHMiLAogICAgICAgY2FwdGlvbiA9ICIiKSArIHhsYWIoIiIpICsgeWxhYigiUGVyY2VudGFnZSBvZiBDb21tZW50cyB3aGljaCBjb250YWlucyBDb2xsZWN0aXZlIFByb25vdW5zIikgK3RoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT04KSkKICAKICAgIGdncGxvdCh3b3JsZG5ld3NfZ3JhcGhzLAogICAgICAgYWVzKHRocmVhdF9sZXZlbCxpbmRpdmlkdWFsLCBzaXplID0gbnVtX2NvbW1lbnRzKSkrIGdlb21fYm94cGxvdChvdXRsaWVyLmFscGhhID0gMCkgKyAKICBnZW9tX2ppdHRlcih3aWR0aD0uMjUsYWxwaGEgPSAwLjIpICsgCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNikgKyBsYWJzKHRpdGxlID0gIkluZGl2aWR1YWwgUHJvbm91biBVc2UgaW4gUG9zdHMgZnJvbSAvci93b3JsZG5ld3MgYnkgU2NhbGUgb2YgVGhyZWF0L1Jlc29sdXRpb24iLAogICAgICAgc3VidGl0bGUgPSAiYWxsIHBvc3RzIGZyb20gMjAxNiB3aXRoIGF0IGxlYXN0IDUwMCBjb21tZW50cywgZWFjaCBjaXJjbGUgcmVwcmVzZW50cyBhIHBvc3Qgc2NhbGVkIGJ5IG51bWJlciBvZiBjb21tZW50cyIsCiAgICAgICBjYXB0aW9uID0gIiIpICsgeGxhYigiVGhyZWF0IFNjYWxlIikgKyB5bGFiKCJQcm9wb3J0aW9uIG9mIGNvbW1lbnRzIHdpdGggaW5kaXZpZHVhbCBwcm9ub3VucyIpK3RoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT04KSkKCiAgbGlicmFyeShSQ29sb3JCcmV3ZXIpCiAgICBnZ3Bsb3Qod29ybGRuZXdzX2dyYXBocyAsYWVzKGRhdGUsY29sX3BjdCxzaXplID0gbnVtX2NvbW1lbnRzLCBuYW1lID0gZnVsbF90aXRsZSwgY29sb3IgPSB0aHJlYXRfbGV2ZWwpKSsKICBnZW9tX3BvaW50KCkrCiAgICB0aGVtZV9jbGFzc2ljKCkrCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoKSsKICAgICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJQYWlyZWQiKSt0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE2KSArIGxhYnModGl0bGUgPSAiQ29sbGVjdGl2ZSBQcm9ub3VuIFVzZSBpbiBQb3N0cyBmcm9tIC9yL3dvcmxkbmV3cyBieSBEYXRlIiwKICAgICAgIHN1YnRpdGxlID0gImFsbCBwb3N0cyBmcm9tIDIwMTYgd2l0aCBhdCBsZWFzdCA1MDAgY29tbWVudHMsIGVhY2ggY2lyY2xlIHJlcHJlc2VudHMgYSBwb3N0IHNjYWxlZCBieSBudW1iZXIgb2YgY29tbWVudHMiLAogICAgICAgY2FwdGlvbiA9ICIiKSArIHhsYWIoIkRhdGUiKSArIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgQ29tbWVudHMgd2hpY2ggY29udGFpbiBDb2xsZWN0aXZlIFByb25vdW5zIikKICAgIAogICAgICAgICAgICAgICAKICAKd29ybGRuZXdzX2dyYXBocyAlPiUKICBmaWx0ZXIodGhyZWF0X2xldmVsID09ICJBbGwgT3RoZXIiKSAlPiUgaGVhZCg1MCkKYGBgCgojI0h5cCB0ZXN0CmBgYHtyfQpwb3Bfc2RfY29sIDwtIHNkKHdvcmxkbmV3c19ncmFwaHMkY29sbGVjdGl2ZSkKcG9wX211X2NvbCA8LSBtZWFuKHdvcmxkbmV3c19ncmFwaHMkY29sbGVjdGl2ZSkKCnBvcF9zZF9pbmQgPC0gc2Qod29ybGRuZXdzX2dyYXBocyRpbmRpdmlkdWFsKQpwb3BfbXVfaW5kIDwtIG1lYW4od29ybGRuZXdzX2dyYXBocyRpbmRpdmlkdWFsKQoKd29ybGRuZXdzX2dyYXBocyAlPiUgZ3JvdXBfYnkodGhyZWF0X2xldmVsKSAlPiUgc3VtbWFyaXNlKAogIE4gPSBuKCksCiAgY29sbGVjdGl2ZV9hdmcgPSBtZWFuKGNvbGxlY3RpdmUpLAogIGluZGl2aWR1YWxfYXZnID0gbWVhbihpbmRpdmlkdWFsKSwKICAKICB0X3Njb3JlX2NvbCA9IChjb2xsZWN0aXZlX2F2ZyAtIHBvcF9tdV9jb2wpKnNxcnQoTikvcG9wX3NkX2NvbCwKICB0X3Njb3JlX2luZCA9IChpbmRpdmlkdWFsX2F2ZyAtIHBvcF9tdV9pbmQpKnNxcnQoTikvcG9wX3NkX2luZCwKICAKICBwX2NvbCA9IHB0KC1hYnModF9zY29yZV9jb2wpLGRmPU4tMSksCiAgcF9pbmQgPSBwdCgtYWJzKHRfc2NvcmVfaW5kKSxkZj1OLTEpCikKCnJlc28gPC0gZmlsdGVyKHdvcmxkbmV3c19ncmFwaHMsIHRocmVhdF9sZXZlbCA9PSAiQWxsIEVudmlyb25tZW50YWwgUmVzb2x1dGlvbnMiKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUpCnBwYiA8LSBmaWx0ZXIod29ybGRuZXdzX2dyYXBocywgdGhyZWF0X2xldmVsID09ICJQZXJzb24vUGxhY2UvQnVzaW5lc3MiKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUpCmNvdW50cnkgPC0gZmlsdGVyKHdvcmxkbmV3c19ncmFwaHMsIHRocmVhdF9sZXZlbCA9PSAiQ291bnRyeSIpICU+JSBzZWxlY3QoY29sbGVjdGl2ZSkKcmVpZyA8LSBmaWx0ZXIod29ybGRuZXdzX2dyYXBocywgdGhyZWF0X2xldmVsID09ICJSZWlnb25hbCIpICU+JSBzZWxlY3QoY29sbGVjdGl2ZSkKZ2xvYiA8LSBmaWx0ZXIod29ybGRuZXdzX2dyYXBocywgdGhyZWF0X2xldmVsID09ICJHbG9iYWwiKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUpCmlzcyA8LSBmaWx0ZXIod29ybGRuZXdzX2dyYXBocywgdGhyZWF0X2xldmVsID09ICJJbnNpZGUgU29sYXIgU3lzdGVtIikgJT4lIHNlbGVjdChjb2xsZWN0aXZlKQpvc3MgPC0gZmlsdGVyKHdvcmxkbmV3c19ncmFwaHMsIHRocmVhdF9sZXZlbCA9PSAiT3V0c2lkZSBTb2xhciBTeXN0ZW0iKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUpCgoKdC50ZXN0KG9zcyRjb2xsZWN0aXZlLGdsb2IkY29sbGVjdGl2ZSwgYWx0ZXJuYXRpdmUgPSAgImdyZWF0ZXIiLCBtdSA9IDAsIAogICAgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLCBjb25mLmxldmVsID0gMC45NSkKYGBgCgoKIyMgU2NvcmUgYW5hbHlzaXMgYnkgdGhyZWF0IHNjYWxlCiMjIFBPVDk5CmBgYHtyfQoKICAKICAKICB3b3JsZG5ld3NfZ3JhcGhzIDwtIHdvcmxkbmV3c19lbnZpcm9ubWVudF90aHJlYXRfbGV2ZWwgJT4lIAogICNmaWx0ZXIocHJvYmxlbSA9PSAicHJvYmxlbSIpICU+JSAKICBzZWxlY3QodGl0bGUsIHRocmVhdF9sZXZlbCwgcHJvYmxlbSkgJT4lCiAgbGVmdF9qb2luKHdvcmxkbmV3c19wb3N0cywuLCBieSA9IGMoInRpdGxlIiA9ICJ0aXRsZSIpKSAlPiUgCiAgc2VsZWN0KC0oc2NvcmUpKSAlPiUKICBtdXRhdGUodGhyZWF0X2xldmVsID0gY2FzZV93aGVuKAogICAgcHJvYmxlbSA9PSAiUmVzb2x1dGlvbiIgfiAiQWxsIEVudmlyb25tZW50YWwgUmVzb2x1dGlvbnMiLAogICAgIWlzLm5hKHRocmVhdF9sZXZlbCkgfiBhcy5jaGFyYWN0ZXIodGhyZWF0X2xldmVsKSwKICAgICBzdGFyX3N5c3RlbSA9PSAibyIgfiAgIk91dHNpZGUgU29sYXIgU3lzdGVtIiwKICAgIHN0YXJfc3lzdGVtID09ICJpIiB+ICAiSW5zaWRlIFNvbGFyIFN5c3RlbSIsCiAgICAgICAgICAgICAgIFRSVUV+IkFsbCBPdGhlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIAogICAgICAgICB0aHJlYXRfbGV2ZWwgPSBmYWN0b3IodGhyZWF0X2xldmVsLHRocmVhdF9sZXZlbHMyKSkgJT4lIGxlZnRfam9pbihwcm9ub3VuX3VzZV9wb3N0LC4sIGJ5ID0gYygidGl0bGUiID0gInRpdGxlIikpICU+JSBmaWx0ZXIoIWlzLm5hKHRocmVhdF9sZXZlbCkpCgoKCgoKd29ybGRuZXdzX2dyYXBoczIgPC0gd29ybGRuZXdzX2dyYXBocyAlPiUgZ3JvdXBfYnkodGl0bGUpICU+JSBzdW1tYXJpc2Uoc2NvcmVfYXZnID0gbWVhbihzY29yZSkpICU+JSB1bmdyb3VwKCkgJT4lIAogbGVmdF9qb2luKHdvcmxkbmV3c19ncmFwaHMsLiwgYnkgPSBjKCJ0aXRsZSIgPSAidGl0bGUiKSkgJT4lIG11dGF0ZShzY29yZV9yYXRpbyA9CiAgICAgICAgICAgICBzY29yZS8oc2NvcmUgLTIqKHNjb3JlLXNjb3JlX2F2ZykpICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICkgJT4lCiAgZmlsdGVyKGNvbGxlY3RpdmUueCA9PSAiQ29udGFpbnMgY29sbGVjdGl2ZSIpCgoKCiAgICBnZ3Bsb3Qod29ybGRuZXdzX2dyYXBoczIsCiAgICAgICBhZXModGhyZWF0X2xldmVsLHNjb3JlX3JhdGlvLCBzaXplID0gbnVtX2NvbW1lbnRzLngpKSsgZ2VvbV9ib3hwbG90KG91dGxpZXIuYWxwaGEgPSAwKSArIAogIGdlb21faml0dGVyKHdpZHRoPS4yNSxhbHBoYSA9IDAuMikgICsKICB0aGVtZV9jbGFzc2ljKCkgKyAgbGFicyh0aXRsZSA9ICJTY29yZSBSYXRpbyBiZXR3ZWVuIGNvbW1lbnRzIHdpdGggQ29sbGVjdGl2ZSBQcm9ub3VucyBhbmQgV2l0aG91dCBpbiBQb3N0cyBmcm9tIC9yL3dvcmxkbmV3cyBieSBTY2FsZSBvZiBUaHJlYXQvUmVzb2x1dGlvbiIsCiAgICAgICBzdWJ0aXRsZSA9ICJhbGwgcG9zdHMgZnJvbSAyMDE2IHdpdGggYXQgbGVhc3QgNTAwIGNvbW1lbnRzLCBlYWNoIGNpcmNsZSByZXByZXNlbnRzIGEgcG9zdCBzY2FsZWQgYnkgbnVtYmVyIG9mIGNvbW1lbnRzIiwKICAgICAgIGNhcHRpb24gPSAiIikgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxKSArIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTIpICt4bGFiKCIiKSArIHlsYWIoIlNjb3JlIHJhdGlvIGJldHdlZW4gY29tbWVudHMgd2l0aCBhbmQgd2l0aG91dCBjb2xsZWN0aXZlIHByb25vdW5zIGZvciBlYWNoIHBvc3QiKSArc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCw0KSkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9OCkpCiAgCiMjIGh5cG90aGVzaXMgdGVzdGluZwogICAgd29ybGRuZXdzX2dyYXBoczIgJT4lCiAgZ3JvdXBfYnkocHJvYmxlbSx0aHJlYXRfbGV2ZWwpICU+JQogIHN1bW1hcmlzZSgKICAgIHRvdGFsX2NvbW1lbnRzID0gc3VtKG51bV9jb21tZW50cy54KSwKICAgIGNvbGxlY3RpdmVfYXZnID0gc3VtKGNvbGxlY3RpdmUqbnVtX2NvbW1lbnRzKS90b3RhbF9jb21tZW50cywKICAgIGluZGl2aWR1YWxfYXZnID0gc3VtKGluZGl2aWR1YWwqbnVtX2NvbW1lbnRzKS90b3RhbF9jb21tZW50cywKICAgIGNvbF9taW4gPWNvbGxlY3RpdmVfYXZnICsgc3FydChjb2xsZWN0aXZlX2F2ZyooMS1jb2xsZWN0aXZlX2F2ZykvdG90YWxfY29tbWVudHMpLAogICAgY29sX21heCA9Y29sbGVjdGl2ZV9hdmcgLSBzcXJ0KGNvbGxlY3RpdmVfYXZnKigxLWNvbGxlY3RpdmVfYXZnKS90b3RhbF9jb21tZW50cykKICApCiAgCiAgCiAgI29ubHkgZW52aXJvbm1lbnRhbAogIAogIHdvcmxkbmV3c19ncmFwaHMgJT4lIGdyb3VwX2J5KHRpdGxlKSAlPiUgc3VtbWFyaXNlKHNjb3JlX2F2ZyA9IG1lYW4oc2NvcmUpKSAlPiUgdW5ncm91cCgpICU+JSAKIGxlZnRfam9pbih3b3JsZG5ld3NfZ3JhcGhzLC4sIGJ5ID0gYygidGl0bGUiID0gInRpdGxlIikpICU+JSBtdXRhdGUoc2NvcmVfcmF0aW8gPSBzY29yZS9zY29yZV9hdmcpICU+JQogICAgZmlsdGVyKGNsaW1hdGVfY2hhbmdlID09ICJyZWxhdGVkIikgJT4lCiAgICBnZ3Bsb3QoCiAgICAgICBhZXModGhyZWF0X2xldmVsLHNjb3JlX3JhdGlvLCBzaXplID0gbnVtX2NvbW1lbnRzLngpKSsgZ2VvbV9ib3hwbG90KG91dGxpZXIuYWxwaGEgPSAwKSArIAogIGdlb21faml0dGVyKHdpZHRoPS4yNSxhbHBoYSA9IDAuMikgKyBmYWNldF9ncmlkKH5jb2xsZWN0aXZlLngpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHRpdGxlID0gIlNjb3JlIFJhdGlvIGJldHdlZW4gY29tbWVudHMgd2l0aCBDb2xsZWN0aXZlIFByb25vdW5zIGFuZCBXaXRob3V0IGluIFBvc3RzIGZyb20gL3Ivd29ybGRuZXdzIGJ5IFNjYWxlIG9mIFRocmVhdC9SZXNvbHV0aW9uIiwKICAgICAgIHN1YnRpdGxlID0gImFsbCBwb3N0cyBmcm9tIDIwMTYgd2l0aCBhdCBsZWFzdCA1MDAgY29tbWVudHMsIGVhY2ggY2lyY2xlIHJlcHJlc2VudHMgYSBwb3N0IHNjYWxlZCBieSBudW1iZXIgb2YgY29tbWVudHMiLAogICAgICAgY2FwdGlvbiA9ICIiKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEpICsgdGhlbWVfY2xhc3NpYygpICt4bGFiKCIiKSArIHlsYWIoIkF2ZXJhZ2Ugc2NvcmUgcmF0aW8gYmV0d2VlbiBjb21tZW50cyB3aXRoIGFuZCB3aXRob3V0IGNvbGxlY3RpdmUgcHJvbm91bnMiKSAKICAKYGBgCgojSFlQT1RIRVNJUyBURVNUSU5HCmBgYHtyfQojU2NvcmUgcmF0aW8KcG9wX3NkIDwtIHNkKHdvcmxkbmV3c19ncmFwaHMyJHNjb3JlX3JhdGlvKQp3b3JsZG5ld3NfZ3JhcGhzMiAlPiUgZ3JvdXBfYnkodGhyZWF0X3Njb3JlKSAlPiUgc3VtbWFyaXNlKAogIE4gPSBuKCksCiAgc2NvcmVfcmF0aW9fYXZnID0gbWVkaWFuKHNjb3JlX3JhdGlvKSwKICB0X3Njb3JlID0gKHNjb3JlX3JhdGlvX2F2ZyAtIDEpKnNxcnQoTikvcG9wX3NkLAogIHAgPSBwdCgtYWJzKHRfc2NvcmUpLGRmPU4tMSkKKQogICAgICAKYGBgCgoK